import org.junit.Test;

import java.time.*;
import java.time.temporal.TemporalAdjusters;

/**LocalDate 、LocalTime、LocalDateTime类的实例时不可变的，分别
 * 表示使用ISO-8601日历系统日期、时间、日期和时间。它们提供简单的日期或时间,并
 * 不包含当前的时间信息。也不包含与时区相关的信息。
 * @description:
 * @author: duanjq
 * @time: 2021/9/19 17:40
 */
public class TestLocalDateTime {
    /**
     * TemporalAdjuster:时间校正器。有时候我们可能需要获取例如：讲日期调整到“下个周日”等操作。
     * TemporalAdjusters:该类通过静态方法提供了大量的常用TemporalAdjuster的实现。例如获取下个周日
     * LocalData nextSunday=LocalDate.now.with(TemporAdjusters.next(DayOfWeek.SUNDAY));
     */
    @Test
    public  void test5(){
        LocalDateTime ldt=LocalDateTime.now();
        System.out.println(ldt);

        LocalDateTime ldt2=ldt.withDayOfMonth(10);//获取本月10日日期
        System.out.println(ldt2);

        //TemporalAdjusters 提供了很多针对日期的方法
        System.out.println(ldt.with(TemporalAdjusters.lastDayOfMonth()));//当前月最后一天
        System.out.println(ldt.with(TemporalAdjusters.firstDayOfMonth()));//当前月第一天
        System.out.println(ldt.with(TemporalAdjusters.firstDayOfYear()));//当年月第一天
        System.out.println(ldt.with(TemporalAdjusters.lastDayOfYear()));//当年月第一天


        LocalDateTime ldt3=ldt.with(TemporalAdjusters.next(DayOfWeek.SUNDAY));
        System.out.println(ldt3);//获取下一个周日

        //自定义:下一个工作日
        LocalDateTime ldt5=ldt.with(
                (l)->{

                    LocalDateTime ldt4=(LocalDateTime) l;
                    DayOfWeek dow=ldt4.getDayOfWeek();
                    if(dow.equals(DayOfWeek.FRIDAY)){
                        return  ldt4.plusDays(3);
                    }else if(dow.equals(DayOfWeek.SATURDAY)){
                        return ldt4.plusDays(2);
                    }else{
                        return  ldt4.plusDays(1);
                    }
                }
        );

        System.out.println(ldt5);


    }




    //3.
    //Duration:计算两个"时间"之间的间隔
    //Period：计算两个“日期”之间的间隔
    //Period
    @Test
    public  void test4(){
       LocalDate ld1=LocalDate.of(2015,1,1) ;
       LocalDate ld2=LocalDate.now();
       Period period=Period.between(ld1,ld2);
       System.out.println(period);

       System.out.println(period.getYears());//6
       System.out.println(period.getMonths());//8
       System.out.println(period.getDays());//18   2015年1月1日和2021年9月19日 相差6年8个月18天

    }


    //Duration
    @Test
    public  void test3(){
        Instant ins1=Instant.now();
        try {
            Thread.sleep(1000);
        }catch (InterruptedException e){

        }
        Instant ins2=Instant.now();

        Duration duration=Duration.between(ins1,ins2);
        //两个日期间的毫秒值
        System.out.println(duration.toMillis());

        System.out.println("--------------------------------");

        LocalTime lt1=LocalTime.now();
        try{
            Thread.sleep(1000);
        }catch (InterruptedException e){

        }
        LocalTime lt2=LocalTime.now();
        System.out.println(Duration.between(lt1,lt2).toMillis());
    }



    //2.Instant：时间戳(以Unix元年:1970年1月1日00:00:00到某个时间之间的毫秒值)
    @Test
    public  void test2(){
        Instant ins1=Instant.now();//默认获取UTC时区 格林威治时间，和我们相差8个小时
        System.out.println(ins1);

        OffsetDateTime odt=ins1.atOffset(ZoneOffset.ofHours(8));//加上八个小时获取我们现在的时间
        System.out.println(odt);

        //获取毫秒值
        System.out.println(ins1.toEpochMilli());

        Instant ins2=Instant.ofEpochSecond(60);//在1970元年上加上60秒
        System.out.println(ins2);


    }






    // 1、LocalDate、LocalTime  LocalDateTime 他们使用方式一样
    @Test
    public void test1(){
        //获取当前时间
        LocalDateTime ldt=LocalDateTime.now();
        System.out.println(ldt);

        //定义时间
        LocalDateTime ld2=LocalDateTime.of(2015,10,25,11,11);
        System.out.println(ld2);

        //当前时间佳3两年
        LocalDateTime ld3=ldt.plusYears(2);
        System.out.println(ld3);
        //当前时间减两个月时间
        LocalDateTime ldt4=ldt.minusMonths(2);
        System.out.println(ldt4);

        System.out.println(ldt.getYear());
        System.out.println(ldt.getMonthValue());
        System.out.println(ldt.getDayOfMonth());
        System.out.println(ldt.getHour());

    }

}
